/**
 *
    算法描述：将每个数字进行翻译即可
    解决所需数据结构+算法：模拟
**/
#include<iostream>
#include<cstring>
using namespace std;

// 只有 . 和 X 两种情况，完全可以用bool数组表示
bool a[6][330];
// 存储所有的填涂情况，设计一个规律，000对应着...刚好就是b[0]的内容。所以直接可以通过翻译.和X的关系，直接得到b的坐标
bool b[8][3] = {{0,0,0}, {0,0,1}, {0,1,0}, {0,1,1}, {1,0,0}, {1,0,1}, {1,1,0}, {1,1,1}};

int main() {
    memset(a, 0, sizeof(a));
    int n;
    char t;
    cin >> n;
    // 一个一个的填充内容
    for(int i=0; i<n; i++) {
        cin >> t;
        switch (t-'0') {

        case 0:
            for(int j=0; j<3; j++) {
                a[1][3 * i + j] = b[7][j];
                a[2][3 * i + j] = b[5][j];
                a[3][3 * i + j] = b[5][j];
                a[4][3 * i + j] = b[5][j];
                a[5][3 * i + j] = b[7][j];
            }
            break;

        case 1:
            for(int j=0; j<3; j++) {
                a[1][3 * i + j] = b[1][j];
                a[2][3 * i + j] = b[1][j];
                a[3][3 * i + j] = b[1][j];
                a[4][3 * i + j] = b[1][j];
                a[5][3 * i + j] = b[1][j];
            }
            break;
        
        case 2:
            for(int j=0; j<3; j++) {
                a[1][3 * i + j] = b[7][j];
                a[2][3 * i + j] = b[1][j];
                a[3][3 * i + j] = b[7][j];
                a[4][3 * i + j] = b[4][j];
                a[5][3 * i + j] = b[7][j];
            }
            break;
        
        case 3:
            for(int j=0; j<3; j++) {
                a[1][3 * i + j] = b[7][j];
                a[2][3 * i + j] = b[1][j];
                a[3][3 * i + j] = b[7][j];
                a[4][3 * i + j] = b[1][j];
                a[5][3 * i + j] = b[7][j];
            }
            break;
        
        case 4:
            for(int j=0; j<3; j++) {
                a[1][3 * i + j] = b[5][j];
                a[2][3 * i + j] = b[5][j];
                a[3][3 * i + j] = b[7][j];
                a[4][3 * i + j] = b[1][j];
                a[5][3 * i + j] = b[1][j];
            }
            break;
        
        case 5:
            for(int j=0; j<3; j++) {
                a[1][3 * i + j] = b[7][j];
                a[2][3 * i + j] = b[4][j];
                a[3][3 * i + j] = b[7][j];
                a[4][3 * i + j] = b[1][j];
                a[5][3 * i + j] = b[7][j];
            }
            break;
        
        case 6:
            for(int j=0; j<3; j++) {
                a[1][3 * i + j] = b[7][j];
                a[2][3 * i + j] = b[4][j];
                a[3][3 * i + j] = b[7][j];
                a[4][3 * i + j] = b[5][j];
                a[5][3 * i + j] = b[7][j];
            }
            break;
        
        case 7:
            for(int j=0; j<3; j++) {
                a[1][3 * i + j] = b[7][j];
                a[2][3 * i + j] = b[1][j];
                a[3][3 * i + j] = b[1][j];
                a[4][3 * i + j] = b[1][j];
                a[5][3 * i + j] = b[1][j];
            }
            break;
        
        case 8:
            for(int j=0; j<3; j++) {
                a[1][3 * i + j] = b[7][j];
                a[2][3 * i + j] = b[5][j];
                a[3][3 * i + j] = b[7][j];
                a[4][3 * i + j] = b[5][j];
                a[5][3 * i + j] = b[7][j];
            }
            break;
        
        case 9:
            for(int j=0; j<3; j++) {
                a[1][3 * i + j] = b[7][j];
                a[2][3 * i + j] = b[5][j];
                a[3][3 * i + j] = b[7][j];
                a[4][3 * i + j] = b[1][j];
                a[5][3 * i + j] = b[7][j];
            }
            break;
        
        default:
            cout << "Problem?" << endl;
            break;
        }
    }

    // 输出部分
    for(int i=1; i<=5; i++) {
        for(int j=0; j<3*n; j++) {
            if(a[i][j]) cout << 'X';
            else cout << '.';

            // 每三个点阵过后需要输出一个  点
            if(j < 3*n-1 && (j+1) % 3 == 0)  cout << '.';
        }
        cout << endl;
    }
    return 0;
}